Ví dụ Ruby_(ngôn_ngữ_lập_trình)

Lưu ý: Các ví dụ sử dụng chuỗi ký tự Unicode để chạy được cần đặt một biến môi trường là $KCODE="u". Hay là chạy #ruby với tùy chọn là -K u vẫn được. Xem thêm những hạn chế của phiên bản Ruby hiện tại với Unicode tại ruby và unicode

1 # Mọi thứ, kể cả tầm thường nhất, là một đối tượng. Vì thế những ví dụ dưới đều chạy được:2 -199.abs                                       # => 199, abs: giá trị tuyệt đối3 "ruby is cool".length                          # => 124 "Rick".index("c")                              # => 25 "Nice Day Isn't It?".split(//).uniq.sort.join  # => " '?DINaceinsty"

Input

print 'Làm ơn gõ tên >'name = gets.chompputs "Chào #{name}."

Hội thoại

1 puts 'Cho tôi con số của bạn'2 number = gets.chomp3 puts number.to_i4 output_number = number.to_i + 15 puts output_number.to_s + ' là một con số lớn hơn.'

Mảng

Khởi tạo và sử dụng một mảng:

a = [1, 'chào', 3.14, 1, 2, [4, 5]]a[2]                      # => 3.14a.reverse                 # => [[4, 5], 2, 1, 3.14, 'chào', 1]a.flatten.uniq            # => [1, 'chào', 3.14, 2, 4, 5]

Khởi tạo và xây dựng một mảng kết hợp (Ruby gọi là hash):

hash = Hash.new                              # Tương đương với hash = {}hash = {:water => 'wet',:fire => 'hot'}      # Đoạn mã đầu trở nên dư thừa khi                                             # đưa cho hash một đối tượng hash riêng biệt mớiputs hash[:fire]                             # Xuất ra "hot"hash.each_pair do |key, value|               # Hoặc: hash.each do |key, value|    puts "#{key} is #{value}"end# Trả về {:water => 'wet',:fire => 'hot'} và xuất ra:# water is wet# fire is hothash.delete:water                            # Hủy cặp giá trị:water => 'wet' và trả về "wet"hash.delete_if {|key, value| value == 'hot'} # Hủy cặp giá trị:fire => 'hot' và trả về {}

Cấu trúc rẽ nhánh

Mệnh đề If:

# Tạo ra một số ngẫu nhiên và in ra số đó là chẵn hay lẻ.if rand(100) % 2 == 0  puts "Là số chẵn"else  puts "Là số lẻ"end

Block và iterator

2 cách để tạo một đoạn block:

{ puts 'Xin chào, thế giới!' } # lưu ý dấu ngoặc# hoặc:do  puts 'Xin chào, thế giới!'end

Một block có thể được truyền đến một hàm (method) như một tham số tùy chọn. Nhiều hàm được cài sẵn có tham số như vậy:

File.open('file.txt', 'w') do |file| # 'w' biểu thị "chế độ ghi chép"  file.puts 'Viết gì đó'end                                  # Tập tin sẽ tự động đóng ở đâyFile.readlines('file.txt').each do |line|  puts lineend# => 'Viết gì đó'

Thông số đi qua block để trở thành closure (ví dụ):

 1 # Trong một biến thể hiện đối tượng (biểu thị bằng '@'), hãy lưu block này. 2 def remember(&p) 3     @block = p 4 end 5  6 # Dùng hàm trên, cho block đó một cái tên. 7 remember {|ten| puts "Xin chào, #{ten}!"} 8  9 # Dùng closure (lưu ý rằng điều này không có áp dụng tự do cho các biến khác):!10 @block.call("Tèo")  # Xuất ra "Xin chào, Tèo!"

Tạo ra một hàm ẩn danh:

proc {|arg| puts arg}Proc.new {|arg| puts arg}lambda {|arg| puts arg}->(arg) {puts arg}         # được giới thiệu ở Ruby 1.9

Trả về closure từ một hàm:

def create_set_and_get(initial_value=0) # Lưu ý initial_value là 0  closure_value = initial_value  [ Proc.new {|x| closure_value = x}, Proc.new { closure_value } ]endsetter, getter = create_set_and_get  # Trả về hai giá trịsetter.call(21)getter.call      # => 21# Biến tham số cũng có thể được sử dụng như là một liên kết cho closure,# Vậy nên hàm trên có thể được viết lại như sau:def create_set_and_get(closure_value=0)  [ proc {|x| closure_value = x }, proc { closure_value } ]end

Trong một hàm, có thể thay đổi block vào lúc gọi hàm:

 1   def bfs(e) 2     q = [] 3     e.mark 4     yield e 5     q.push e 6     while not q.empty? 7       u = q.shift 8       u.edge_iterator do |v| 9       if not v.marked?10         v.mark11         yield v12         q.push v13       end  14     end15   end16   bfs(e) {|v| puts v}

Duyệt lần lượt trên enumation và mảng bằng cách dùng block:

1 a = [1, 'chào', 3.14]2 a.each {|item| puts item}          # Xuất ra toàn bộ phần tử3 (3..6).each {|num| puts num}       # Xuất ra các số từ 3 đến 6

Block cũng có thể dùng với các hàm dựng sẵn:

1 File.open('taptin.txt', 'w+b') do |taptin|2   taptin.puts 'Viết linh tinh gì đó.'3 end                # File được tự động đóng lại tại đây

Hay:

1 IO.readlines('taptin.txt') do |dòng|2   # Xử lý từng dòng ở đây.3 end

Sử dụng enumeration và block để xuất ra lũy thừa 2 của các số từ 1 đến 10:

(1..10).collect {|x| x*x}    => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Lớp

Đoạn mã sau định nghĩa một lớp tên là Person. Bên cạnh phương thức khởi tạo initialize, là phương thức được gọi đến khi cần tạo đối tượng mới, lớp này còn có 2 phương thức khác: một là ghi đè lên toán tử so sánh <=> (vì thế Array#sort có thể sắp xếp theo tuổi) và hai là là ghi đè lên phương thức to_s (vì thế Kernel#puts có thể định dạng đầu ra của nó). Ở đây, attr_accessor là một ví dụ của meta-programming trong Ruby: nó định nghĩa các phương thức dạng getter và setter của biến thực thể, trong khi attr_reader các phương thức dạng 'getter'. Và, câu lệnh cuối cùng trong một phương thức là giá trị trả về của nó, điều này cho phép bỏ qua lệnh return.

 1 class Person 2   attr_reader:name,:age 3   def initialize(name, age) 4     @name, @age = name, age 5   end 6   def <=>(person)           # Định nghĩa toán tử so sánh 7     @age <=> person.age 8   end 9   def to_s10     "#{@name} (#{@age})"11   end12 end13 14 group = [15   Person.new("Bob", 33),16   Person.new("Chris", 16),17   Person.new("Ash", 23)18 ]19 20 puts group.sort.reverse

Đoạn mã trên in ra ba tên theo tuổi giảm dần:

Bob (33)Ash (23)Chris (16)

Ngoại lệ

Một trường hợp ngoại lệ được đưa ra với lệnh raise:

raise

Có thể thêm một thông báo tùy chọn:

raise "Đây là một thông báo"

Ngoại lệ cũng có thể xác định bởi các lập trình viên:

raise ArgumentError, "Tranh luận bất hợp pháp!"

Ngoài ra, một thực thể của lớp Ngoại lệ có thể tạo ra được với biến raise như sau:

raise ArgumentError.new("Tham số không phù hợp!")

Một vài ví dụ

Có thể tìm thấy các code mẫu của Ruby dưới dạng các thuật toán tại:

Tài liệu tham khảo

WikiPedia: Ruby_(ngôn_ngữ_lập_trình) http://www.artima.com/intv/ruby4.html http://www.garyc40.com/2008/02/ruby-ky-niem-sinh-n... http://www.garyc40.com/tu-hoc-ruby/ http://redhanded.hobix.com/ http://www.informit.com/articles/article.asp?p=182... http://www.linuxdevcenter.com/pub/a/linux/2001/11/... http://www.loudthinking.com/arc/000199.html http://blog.nicksieger.com/articles/2006/10/20/rub... http://www.rubycentral.com/book/ http://ruphus.com/blog/2005/06/11/ruby-and-unicode...